EC2 Instance Connect エンドポイントを使って手元の Windows 11 端末からプライベートサブネットの EC2 に WinSCP でファイルコピーしてみた
コーヒーが好きな emi です。
EC2 Instance Connect エンドポイントを使って手元の Windows 11 端末からプライベートサブネットの EC2 に WinSCP でファイルコピーしてみました。
検証手順を連携します。
構成図
以下のような構成で検証します。
準備
以下のブログとほぼ同じ準備が必要です。
このブログと違う点は以下の 2 点です。
- キーペアのタイプで
.ppk
が必要であること - WinSCP のインストールが必要であること
AWS 環境の構築
以下のブログを参考に、AWS 環境の構築を実施してください。
- 事前準備
- セキュリティグループの作成
- EC2 Instance Connect (EIC) Endpointの作成
- EC2 インスタンス(Amazon Linux 2)の作成
- 上記ブログの手順ではキーペアのタイプで
.pem
を設定していますが、WinSCP では.ppk
タイプのキーペアが必要です。 - SSH 接続をおこなう場合は
.pem
形式のキーペアが必要です。 - あとから追加もできますので、要件に応じて選択してください。
- 上記ブログの手順ではキーペアのタイプで
接続元の端末で AWS CLI とプロファイル(IAM ユーザーのアクセスキー)の設定
接続元とする手元の端末で AWS CLI のインストールとプロファイル(IAM ユーザーのアクセスキー)の設定をします。
今回は以下ブログを参考に、私が使用している Windows 11 で設定します。
コマンドプロンプトで以下のように AWS CLI のバージョンを確認できます。
C:\Users\kitani.emi>aws --version aws-cli/2.13.30 Python/3.11.6 Windows/10 exe/AMD64 prompt/off C:\Users\kitani.emi>
AWS CLI 用の IAM ユーザー「eic-endpoint-test」を作成し、アクセスキーを手元の端末に設定します。
EC2 Instance Connect Endpoint を使用するための IAM 権限は以下のドキュメントを参考にしました。
- Windows インスタンス用ユーザーガイド|ユーザーに EC2 Instance Connect Endpoint を使用したインスタンスへの接続を許可
- Linux インスタンス用ユーザーガイド|ユーザーに特定のインスタンスへの接続を許可
今回私が設定した権限は以下になります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2InstanceConnect", "Effect": "Allow", "Action": "ec2-instance-connect:OpenTunnel", "Resource": [ "arn:aws:ec2:ap-northeast-1:123456789012:instance-connect-endpoint/eice-03a123cad4174aaf4" ], "Condition": { "NumericEquals": { "ec2-instance-connect:remotePort": "22" }, "IpAddress": { "ec2-instance-connect:privateIpAddress": "10.0.10.11/32" } } }, { "Sid": "Describe", "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceConnectEndpoints" ], "Resource": "*" }, { "Sid": "SendSSHPublicKey", "Effect": "Allow", "Action": "ec2-instance-connect:SendSSHPublicKey", "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/*" } ] }
"ec2-instance-connect:OpenTunnel"
を、作成した EIC エンドポイントの arn に対し、ポート 22 で許可します。10.0.10.11/32
は作成した Amazon Linux 2 のプライベート IP アドレスです。"ec2-instance-connect:SendSSHPublicKey"
も許可していますが、このブロックは EC2 Instance Connect エンドポイントを使って手元の Windows 11 端末からプライベートサブネットの EC2 にSSH 接続し、SCP コマンドでファイルコピーしてみた|DevelopersIO の検証をおこなった際のなごりです。本記事の WinSCP での検証をおこなう場合は無くても大丈夫です。SSH 接続の要件がある場合、必要に応じて追加してください。
この権限を付与した IAM ユーザーのアクセスキーを発行し、.aws
配下の config
ファイルと credentials
ファイルにプロファイル情報を追記します。
- config ファイルの例
[default] region = ap-northeast-1 output = json [profile eic-endpoint-test] region = ap-northeast-1 [profile test-role] region = ap-northeast-1
- credentials の例
[default] aws_access_key_id = AKIAxxxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [eic-endpoint-test] aws_access_key_id = AKIAxxxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [test-role] aws_access_key_id = AKIAxxxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WinSCP のインストール
WInSCP がインストールされていない場合は以下のブログを参考にインストールしてください。
キーペアの作成と設定
EC2 のキーペアとして .ppk
形式のキーペアを設定していない場合は、以下の手順を参考に .ppk
形式のキーペアを追加してください。
セッションマネージャーで接続する準備をおこなっていない方は、以下のブログを参考にコマンドプロンプトで EC2 インスタンスに SSH 接続して公開鍵の文字列を登録してください。
WinSCP 用のユーザーを作成いただいても大丈夫ですし、ec2-user を使う場合は以下の画像のように 1 つの authorized_keys
ファイルの中に複数公開鍵の文字列を登録することもできます。
WinSCP でファイルコピーする
準備ができたら、WinSCP でファイルコピーを試していきます。
まずは ec2-instance-connect open-tunnel コマンドでローカルマシン(今回は手元の Windows 11 端末)と EC2 インスタンス間に SSH トンネルを開いておきます。
Linux インスタンス用ユーザーガイド|SSH を使用した Linux インスタンスへの接続 も参考にして下さい。
コマンドプロンプトで以下のコマンドを実行します。
aws ec2-instance-connect open-tunnel ^ --instance-id i-xxxxxxxxxxxxxxxxx ^ --remote-port 22 ^ --local-port 10022 ^ --profile eic-endpoint-test
i-xxxxxxxxxxxxxxxxx
には、作成した(接続する)EC2 インスタンスのインスタンス ID を入れてください。
- 実行結果
C:\Users\kitani.emi>aws ec2-instance-connect open-tunnel ^ More? --instance-id i-0a1d205bd3242dca6 ^ More? --remote-port 22 ^ More? --local-port 10022 ^ More? --profile eic-endpoint-test Listening for connections on port 10022.
最後が Listening for connections on port 10022.
となり、SSH トンネルが開いた状態になります。
このコマンドプロンプトのウィンドウは開いたままにしてください。
では、この状態で WinSCP を開きます。
以下のように入力します。
- 転送プロトコル:SFTP
- ホスト名:localhost
- ポート番号:10022(SSH トンネルを張ったときに設定したローカルポートのポート番号)
- ユーザー名:ec2-user(キーペアを登録したユーザー)
入力できたら「設定」をクリックします。
[SSH] - [認証] の「秘密鍵」で、キーペア(.ppk
形式)を保存している手元の Windows 11 端末のパスを入力します。
入力できたら「OK」をクリックします。
「ログイン」をクリックします。
初めて接続する際は、以下のように警告が出ます。このまま「はい」で進めます。
EC2 インスタンスに接続できました。
手元の Windows 11 端末のエクスプローラーから、WinSCP にテストファイルをドラッグ&ドロップします。
テストファイルを EC2 上にアップロードできました。
WinSCP でファイルを作成してみます。
空白部分で右クリックし、[新規] - [ファイル] をクリックします。
任意のファイル名を入力し、「OK」をクリックします。
ファイルの中身を編集できます。
左上の上書き保存のアイコンで上書き保存し、右上の×をクリックして作成したファイルを閉じます。
WinSCP 上で作成したファイルが表示されているのが分かります。
WinSCP 上で見えている EC2(RHEL9)上のファイルを、ドラッグ&ドロップで手元の Windows 11 端末にコピーします。
手元の Windows 11 端末にファイルをコピーできました。